//package com.xy.auth.config;
//
//import com.xy.auth.properties.JwtCAProperties;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.io.ClassPathResource;
//import org.springframework.http.HttpMethod;
//import org.springframework.security.authentication.AuthenticationManager;
//import org.springframework.security.crypto.password.PasswordEncoder;
//import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
//import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
//import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
//import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
//import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
//import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
//import org.springframework.security.oauth2.provider.token.TokenStore;
//import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
//import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
//import org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory;
//
//import java.security.KeyPair;
//import java.util.Arrays;
//
//
////使用jwt 公钥私钥
//@Configuration
//@EnableAuthorizationServer
//public class AuthServerUserJwtPrivatePublicKeyConfig extends AuthorizationServerConfigurerAdapter {
//
//    private static final String CLIENT_ID = "client";
//    private static final String SECRET_CHAR_SEQUENCE = "123123123";
//    private static final String ALL = "all";
//    private static final int ACCESS_TOKEN_VALIDITY_SECONDS = 30 * 60;
//    // 密码模式授权模式
//    private static final String GRANT_TYPE_PASSWORD = "password";
//    //授权码模式
//    private static final String AUTHORIZATION_CODE = "authorization_code";
//    //简化授权模式
//    private static final String IMPLICIT = "implicit";
//    //客户端模式
//    private static final String CLIENT_CREDENTIALS = "client_credentials";
//
//    @Autowired
//    private JwtCAProperties jwtCAProperties;
//
//    @Autowired
//    private PasswordEncoder passwordEncoder;
//
//    @Autowired
//    private AuthenticationManager authenticationManager;
//
//
//
//    /**
//     * 方法实现说明:使用公钥私钥配置jwt
//     *
//     * @author:smlz
//     * @return:
//     * @exception:
//     * @date:2020/1/21 21:49
//     */
//    @Bean
//    public TokenStore tokenStore() {
//        return new JwtTokenStore(jwtAccessPriAndIndiviTokenConverter());
//    }
//
//
//    //使用公钥私钥配置jwt 解析jwt
//    @Bean
//    public JwtAccessTokenConverter jwtAccessPriAndIndiviTokenConverter() {
//        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
//        //jwt的密钥
//        converter.setKeyPair(keyPair());
//        return converter;
//    }
//
//    //使用公钥私钥给token 增加额外的信息配置jwt
//    @Bean
//    public XyTokenEnhancer xyTokenEnhancer() {
//        return new XyTokenEnhancer();
//    }
//
//
//    //使用公钥私钥配置jwt
//    @Bean
//    public KeyPair keyPair() {
//        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource(jwtCAProperties.getKeyPairName()), jwtCAProperties.getKeyPairSecret().toCharArray());
//        return keyStoreKeyFactory.getKeyPair(jwtCAProperties.getKeyPairAlias(), jwtCAProperties.getKeyPairStoreSecret().toCharArray());
//    }
//
//
//    @Override
//    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
//        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
//        //使用公钥私钥设置jwt
//        tokenEnhancerChain.setTokenEnhancers(Arrays.asList(xyTokenEnhancer(), jwtAccessPriAndIndiviTokenConverter()));
//        endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager).tokenEnhancer(tokenEnhancerChain)
//                .reuseRefreshTokens(Boolean.FALSE)
//                .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST); //支持GET,POST请求
//
//    }
//
//    @Override
//    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
//        //第三方客户端校验 token 需要带入 clientId 和 clientSecret 来校验
//        security.checkTokenAccess("isAuthenticated()")
//                .tokenKeyAccess("isAuthenticated()");//来获 取我 们的 tokenKey 需要 带入clientId,clientSecret
//        //允许表单认证
//        security.allowFormAuthenticationForClients();
//    }
//
//    @Override
//    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//        /**
//         *授权码模式
//         * 请求code: 如果请求的code带着url ,那么获取token的时候必须要带着url
//         *http://localhost:8900/oauth/authorize?response_type=code&client_id=client&redirect_uri=http://www.baidu.com&scope=all
//         *http://localhost:8900/oauth/authorize?response_type=code&client_id=client
//         *
//         * implicit: 简化模式
//         *http://localhost:8900/oauth/authorize?client_id=client&response_type=token&scope=all&redirect_uri=http://www.baidu.com
//         *
//         * password模式
//         *  http://localhost:8900/oauth/token?username=fox&password=123456&grant_type=password&client_id=client&client_secret=123123&scope=all
//         *
//         *  客户端模式
//         *  http://localhost:8900/oauth/token?grant_type=client_credentials&scope=all&client_id=client&client_secret=123123
//         *
//         *  刷新令牌
//         *  http://localhost:8900/oauth/token?grant_type=refresh_token&client_id=client&client_secret=123123&refresh_token=[refresh_token值]
//         */
//
//        //如果是 非对称加密 使用证书的形式：需要用这个链接获取公钥：localhost:8900/oauth/token_key  并带上请求头：key 为 Authorization  值 为 (clientid ,client_secret  ==> clientid:client_secret  并对这个字符串进行base64编码 然后在 编码的前面加上"Basic ")
//        //然后就能判断此token 是不是合法的 通过这个接口拿的有换行符（/n）需要把所有的/n删除
//        //还有一个接口直接可以检测token是否可用:localhost:8900/oauth/check_token?token=之前获取的token合法性，并返回具体的jwt的值 同样需要client 和secret校验 同样的
//
//
//        clients.inMemory()
//                //配置client_id
//                .withClient(CLIENT_ID)
//                //配置client-secret
//                .secret(passwordEncoder.encode(SECRET_CHAR_SEQUENCE))
//                //配置访问token的有效期
//                .accessTokenValiditySeconds(3600)
//                //配置刷新token的有效期
//                .refreshTokenValiditySeconds(864000)
//                //配置redirect_uri，用于授权成功后跳转
//                .redirectUris("http://www.baidu.com")
//                //配置申请的权限范围
//                .scopes("all")
//                //配置grant_type，表示授权类型
//                /**
//                 * 配置grant_type，表示授权类型
//                 * authorization_code: 授权码模式
//                 * implicit: 简化模式
//                 * password： 密码模式
//                 * client_credentials: 客户端模式
//                 * refresh_token: 更新令牌
//                 */
//                .authorizedGrantTypes(AUTHORIZATION_CODE, GRANT_TYPE_PASSWORD, IMPLICIT, CLIENT_CREDENTIALS, "refresh_token");
//    }
//}
